<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>call和apply方法的使用</title>
</head>

<body>

</body>
<script>
  /* 
   * 1、找出数组的最大元素
   * 2、将类数组转换成真正的数组
   * 3、数组追加
   * 4、利用call 和 apply 做继承
   * 5、使用log代理console.log()
  */


  // 1、找出数组的最大元素
  // var max = Math.max(1, 2, 3, 4, 5, 6);
  // console.log(max);
  var arr = [2, 1, 3, 34, 2421, 32423, 10];
  var max = Math.max.apply(null, arr);
  console.log(max);

  // 2、将类数组转换成真正的数组
  function add() {
    console.log(arguments);
    // 利用 Array 的 slice 方法结合 apply 实现浅复制
    var arr = Array.prototype.slice.apply(arguments);
    console.log(arr);
  }
  add(1, 2, 3);

  // 3、数组追加
  var arr = [];
  Array.prototype.push.apply(arr, [1, 2, 3, 4, 5]);
  console.log(arr); // [1,2,3,4,5]

  // 4、利用call 和 apply 做继承
  // 动物类
  function Animal(name, age) {
    this.name = name;
    this.age = age;
    this.sayAge = function () {
      console.log(this.age);
    }
  }

  // Cat
  function Cat(name, age) {
    console.log(this);
    // 继承了Animal
    Animal.call(this, name, age);  // 把this指向了c实例对象
  }
  var c = new Cat('大黄', 108);

  // Dog
  function Dog() {
    Animal.apply(this, arguments);
  }
  var d = new Dog('小米', 190);
  console.log(d);

  // 5、使用log代理console.log()
  function log() {
    console.log.apply(console, arguments);
  }
  log(d);


  // bind es5新增的方法，主要作用：将函数绑定到某个对象中，并且有返回值（一个函数）
  function fn(y) {
    return this.x + y
  }
  var obj = {
    x:1
  }
  var gn = fn.bind(obj);
  console.log(gn(3));

  // 常见的函数式编程技术 - 函数柯里化
  function getConfig(colors,size,otherOptions){
    console.log(colors,size,otherOptions);
  }
  var defaultConfig = getConfig.bind(null,'#ffee00',1024*768);
  defaultConfig('123');
  defaultConfig('456');

  /* 
    var onSuccess = function(result){}; //成功的回调
var onFail = function(error){}; //失败的回调
var req = new XMLHttpRequest();
req.open("POST", "www.baidu.com", true);
req.onload = function(){
  if(req.readyState === 4 && req.status === 200){
    onSuccess(req.response);
  } else {
    onFail(req.statusText);
  }
}
req.onerror = function(){
  onFail(Error("网络异常"));
}
  
  */

  const myAjax = ()=>{
    
  }


















</script>

</html>